№ · BUFF 系统 CH.06.22
主页 · ⚡ Buff 系统 · 状态判定服务 (StateDecisionService)

状态判定服务 (StateDecisionService)

📅 2026-06-22 · 📦 15.1 KB · ⚡ Buff 系统 · 📝 MD 文档 🏷️ 员工🏷️ Buff🏷️ 设计

在挂机与模拟经营类游戏的底层设计中,**“基于属性数值的直接判定”**往往会导致系统耦合度过高(即代码中充斥着大量的 if (cleanliness < 30 && mood < 30) 这样硬编码的条件判断)。

为了提高系统的扩展性与配置化程度,**构建一套“Buff(增益/减益)系统”作为状态切换的“粘合剂”**是非常标准且高效的做法。

以下是为《同福客栈》量身定制的Buff系统架构与状态机标签判定设计文档。通过这套体系,客栈的数值变化、员工行为、外部事件等都将被转化为 Buff,客栈的经营状态切换将**完全依赖于“是否拥有某类 Buff/标签”**来进行判定。

《同福客栈》经营状态与核心数值体系设计文档 —— Buff系统子文档(V1.0 架构版)

一、 Buff 系统核心架构设计

为了实现高扩展性,系统将客栈内的一切“非基础常态变化”都抽象为 Buff/Debuff(以下统称 Buff)。

1.1 Buff 数据实体结构 (Entity Structure)

每个 Buff 包含以下核心字段,程序可通过解析这些字段来实现属性修改与状态切换判定。

| 字段名 | 字段类型 | 说明 | 示例 | | :-------------- | :------------- | :--------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | | Buff_ID | String | 唯一标识符 | BUFF_STAFF_LBA_001 | | Name | String | 策划配置的文本名称 | “老白值守” | | Target_Type | Enum | 作用目标:Inn (客栈全局), Staff (员工个体), Zone (特定区域) | Inn | | Category | Enum | 属性分类:环境、安防、财务、心情、声望、食材、舆论、势力 | 安防 | | Tags | List[String] | 核心标签:用于状态机判定的逻辑索引 | ["#SecurityGuard", "#LaoBaiActive"] | | Modifiers | List[JSON] | 数值修饰符:对基础数值变化速率或乘区的修改 | [{"attr": "Security_Decay_Rate", "type": "Mul", "val": 0.0}, {"attr": "Security_Recovery", "type": "Add", "val": 6.0}] | | Duration_Type | Enum | 持续类型:Time (时间倒计时), Conditional (条件满足时挂载/卸载), Infinite (永久) | Conditional | | Duration_Val | Float/Expr | 持续的具体数值或触发卸载的逻辑表达式 | Check_Staff_OnDuty("白展堂") == true | | Conflict_Rule | JSON | 互斥与堆叠规则:覆盖、共存、高等级优先 | {"group": "Security_Guard", "rule": "Override"} |

二、 核心 Buff / Debuff 库设计(《武林外传》特色)

通过在客栈或员工身上挂载以下 Buff,可以动态地、无侵入地改变客栈的数值生态,并为状态机提供判定依据。

2.1 客栈全局 Buff 库(Inn-Level Buffs)

| Buff ID | Buff 名称 | 携带标签 (Tags) | 数值修正效果 (Modifiers) | 挂载与卸载条件 | | :--------------------- | :--------- | :------------------------------ | :--------------------------------- | :-------------------------------------------- | | BUFF_INN_SAN_CRISIS | 垃圾堆积 | ["#SanitationCrisis"] | 客人投诉率 +200%,口碑每日 -5 | 挂载:环境清洁度 $< 30$
卸载:环境清洁度 $\ge 40$ | | BUFF_INN_SEC_CRISIS | 门户大开 | ["#SecurityCrisis"] | 偷窃概率 +300%,斗殴概率 +200%,设施折旧速度 +100% | 挂载:安防值守值 $< 30$
卸载:安防值守值 $\ge 40$ | | BUFF_INN_PEAK_HOUR | 高朋满座 | ["#PeakHour"] | 客流上限 +50%,营收 +50%,资源消耗率 +40% | 挂载:饭点时段 + 口碑 $\ge 60$
卸载:时段结束 | | BUFF_INN_RUMOR_01 | 怡红楼造谣 | ["#PrCrisis", "#Rumor"] | 舆论负面值 +5/游戏小时,客流每日递减 3% | 挂载:同行造谣随机事件触发
卸载:公关应对成功 / 持续 24 小时 | | BUFF_INN_GOV_INSPECT | 突击卫生检查 | ["#GovAction", "#SanInspect"] | 清洁度强制 -15 分 | 挂载:衙门好感度极低时每日随机触发
卸载:即时结算一次,随后自动销毁 |

2.2 员工专属 Buff 库(Staff-Level Buffs)

员工身上的 Buff 状态会通过**加权或逻辑关系(如 Any / All)**投射到客栈全局。

| Buff ID | 适用岗位 | Buff 名称 | 携带标签 (Tags) | 对员工个体的影响 | 对客栈全局的间接影响 (投射) | | :--------------------- | :--- | :--------------- | :------------------------------------ | :-------------------- | :------------------------------------------------------------ | | BUFF_STF_LBA_GUARD | 跑堂 | 葵花点穴手 | ["#LaoBaiActive", "#SecurityGuard"] | 心情自然衰减速度 +50% | 投射:客栈挂载 BUFF_INN_SEC_GUARD
(安防自然衰减设为 0,每小时恢复+6) | | BUFF_STF_GUR_LAZY | 跑堂 | 排山倒海 (情绪版) | ["#StaffLazy", "#WaiterCrisis"] | 上菜速度 -30%,安防值守效率 -40% | 投射:客栈挂载 #WaiterCrisis 标签 | | BUFF_STF_CHEF_STRIKE | 厨子 | 罢工边缘 | ["#ChefCrisis"] | 出餐速度 -30%,菜品出错率 +20% | 投射:客栈挂载 #ChefCrisis 标签
(若心情 $< 20$ 变为 #ChefAbsent) | | BUFF_STF_ACCT_ERR | 账房 | 算错账 | ["#AccountantCrisis"] | 收银错账率 +15% | 投射:客栈每日结算时损失 5% 营业额 |

三、 基于 Buff 标签的客栈状态机(State Machine)重构

重构后,状态机的切换不再直接读取数值,而是通过查询客栈当前挂载的“Buff 标签 (Tags)”来执行状态切换。这种设计极大地简化了状态判定的条件分支。

3.1 状态判定流程图 (Logic Flow)

[ 每日 6 点 / 营业中实时 ] │ ▼ [1. 遍历当前客栈及员工的所有 Active Buffs] │ ▼ [2. 收集并合并所有的 Tags 集合 (如 ["#SanitationCrisis", "#ChefCrisis"])] │ ▼ [3. 根据状态机优先级判定表进行 Tag 匹配] │ ├─► 优先匹配【强制停摆类】Tags? (是 -> 切入对应停摆状态) ├─► 其次匹配【异常限制类】Tags? (是 -> 切入对应限制状态) └─► 以上皆无? (切入【正常经营】状态)

3.2 标签化状态判定配置表

| 目标状态 | 优先级 | 核心 Tag 触发组合 (满足其一即可) | 对应底层业务逻辑实现 | | :--------- | :----: | :--------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------- | | 资金断裂歇业 | 1 (最高) | 客栈携带 #Bankruptcy | 判定客栈余额比 $< 0.5$ 触发此 Buff。全店歇业,所有员工心情持续衰减。 | | 食品安全停业 | 2 | 客栈携带 #FoodSafetyViolation
或 携带 #PrCollapse | 玩家使用变质食材导致食客中毒,或负面舆论值达 100 挂载此 Buff。强制停业 6 小时。 | | 治安停业整顿 | 3 | 客栈携带 #SecurityCollapse
或 携带 #GovSecurityShutdown | 安防值归零触发 #SecurityCollapse。强制停业 4 小时,大堂设施耐久扣减。 | | 临时卫生整顿 | 4 | 客栈携带 #SanitationCollapse
或 携带 #GovSanitationShutdown | 清洁度 $< 10$ 触发 #SanitationCollapse。强制停业 2 小时,扣减罚款。 | | 半营业状态 | 5 | 客栈携带以下任意标签:
#SanitationCrisis (清洁 $< 30$)
#ChefCrisis (厨子心情 $< 30$)
#SupplyCrisis (食材不足 $< 40%$) | 限制 50% 客位,菜品解锁数减半,营收 -40%。对应短板模块完全停摆。 | | 口碑限流状态 | 6 | 客栈携带 #ReputationCrisis | 综合口碑 $< 40$ 挂载此 Buff。客流上限 -60%,客单价 -20%。 | | 安保预警状态 | 7 | 客栈携带 #SecurityCrisis | 安防值 $< 30$ 挂载此 Buff。偷窃/斗殴事件概率翻倍。 | | 高峰营业 | 8 | 客栈携带 #PeakHour | 饭点时段自动挂载。客流上限 +50%,营收 +50%。 | | 正常营业 | 9 (最低) | 无任何以上判定 Tags,且满足 #MinimumRequirement | 所有基础指标正常,全区域开放,数值正常衰减/增长。 |

3.3 示例:状态切换代码逻辑伪代码 (C# / Python 概念)

def update_inn_state(inn_entity): # 1. 收集客栈全局和员工的所有活动 Buff 标签 active_tags = set() for buff in inn_entity.get_active_buffs(): active_tags.update(buff.tags)

for staff in inn_entity.get_on_duty_staff():
    for buff in staff.get_active_buffs():
        # 员工身上的危机标签可以投射到客栈
        active_tags.update(buff.tags)

# 2. 状态优先级判定 (从高到低)
if "#Bankruptcy" in active_tags:
    return InnState.FORCED_BANKRUPTCY_HALT
elif "#FoodSafetyViolation" in active_tags or "#PrCollapse" in active_tags:
    return InnState.FORCED_FOOD_SAFETY_HALT
elif "#SecurityCollapse" in active_tags:
    return InnState.FORCED_SECURITY_HALT
elif "#SanitationCollapse" in active_tags:
    return InnState.FORCED_SANITATION_HALT
elif any(tag in active_tags for tag in ["#SanitationCrisis", "#ChefCrisis", "#SupplyCrisis"]):
    return InnState.ABNORMAL_HALF_BUSINESS
elif "#ReputationCrisis" in active_tags:
    return InnState.ABNORMAL_REPUTATION_LIMIT
elif "#SecurityCrisis" in active_tags:
    return InnState.ABNORMAL_SECURITY_WARNING
elif "#PeakHour" in active_tags:
    return InnState.NORMAL_PEAK
else:
    return InnState.NORMAL_BUSINESS

四、 Buff 生命周期与结算引擎设计

4.1 挂载与卸载引擎 (Mount/Dismount Engine)

Buff 的产生和消亡由各个子系统的 监听器 (Listeners) 驱动:

  1. 数值监听器 (Value Listeners):
    • 例如:当 Environment_Cleanliness 变化时触发回调,检测是否跌破 30。若跌破,则实例化 BUFF_INN_SAN_CRISIS 并挂载至客栈实体,自动向全局标签池抛出 #SanitationCrisis 标签;若回升至 40 以上(防抖回差),则销毁该 Buff。
  2. 事件监听器 (Event Listeners):
    • 例如:触发“大堂砸坏”事件,直接给客栈挂载一个无视时间、只有完成修复才能卸载的 #SecurityCollapse 标签。
  3. 时间计时器 (Tick Timer):
    • 例如:“高峰期”或“公关持续时间”,每游戏分钟进行 Tick 扣减,时间归零时自动注销 Buff。

4.2 互斥与堆叠规则 (Conflict Resolution)

在《武林外传》中,许多人物行为或外部事件具有冲突性。通过 Conflict_Rule 来进行约束:

  • 【覆盖规则 (Override)】:
    • 若客栈挂载了 BUFF_INN_SEC_COLLAPSE(安防崩溃,治安整顿中),此时白展堂被强行安排值守,产生 BUFF_STF_LBA_GUARD(葵花点穴手)。
    • 由于店铺处于停业整顿期间,安保状态无法恢复,因此整顿状态 Buff 的优先级高。安防崩溃 Buff 会**暂时挂起(Suspend)**值守 Buff 的恢复效果,直到整顿结束。
  • 【共存/相加规则 (Add)】:
    • 若小郭挂载了“手疼(心情下降)”Buff,老白挂载了“加班(心情下降)”Buff。它们产生的 #StaffMoodDown 标签独立存在,两者的数值修正系数相加(心情平均值扣减叠加)。
  • 【防抖缓冲区规则 (Hysteresis Buffer)】:
    • 避免因临界点跳跃导致 Buff 频繁挂载/卸载。例如 BUFF_INN_SAN_CRISIS(垃圾堆积)在清洁度 <30 时挂载,但必须等到清洁度 \ge 40 时才会卸载。在这个 10 分的缓冲区内,标签状态保持不变。

五、 本套Buff体系对开发的实际意义

  1. 极易配置新内容:如果未来想加入新角色“姜小花(无双的师兄)”,策划只需要在 Excel 配置表里新建一个 Buff 叫 BUFF_STF_JXH_TRAIT,挂上 #SecurityGuard 标签。游戏代码一行都不用改,系统就能自动识别他能够协助老白维护安防。
  2. 事件逻辑更解耦:突发事件(如“怡红楼恶意低价竞争”)可以简单地给客栈塞入一个“特价打折”Debuff,贴上 #ReputationCrisis 标签。客栈状态机在不知晓“怡红楼”存在的情况下,依靠标签就能正确切换至“口碑限流状态”,开发效率显著提升。